home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / djgpp / go32 / dpmisim.asm < prev    next >
Encoding:
Assembly Source File  |  1994-04-23  |  4.9 KB  |  294 lines

  1. ; This is file DPMISIM.ASM
  2. ;
  3. ; Copyright (C) 1993 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954
  4. ;
  5. ; This file is distributed under the terms listed in the document
  6. ; "copying.dj", available from DJ Delorie at the address above.
  7. ; A copy of "copying.dj" should accompany this file; if not, a copy
  8. ; should be available from where this file was obtained.  This file
  9. ; may not be distributed without a verbatim copy of "copying.dj".
  10. ;
  11. ; This file is distributed WITHOUT ANY WARRANTY; without even the implied
  12. ; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  13. ;
  14.  
  15.     title    dpmisim
  16.     .386p
  17.  
  18.     include    segdefs.inc
  19.     include tss.inc
  20.     include gdt.inc
  21.     include idt.inc
  22.  
  23. ;------------------------------------------------------------------------
  24.  
  25.     start_data16
  26.  
  27.     extrn    _r_tss:tss_s
  28.     extrn    _arena_cs:word
  29.     extrn    _arena_ds:word
  30.     extrn    _core_selector:word
  31.     extrn    _tss_ptr:word
  32.     extrn    _ARENA:dword
  33.  
  34.     public    _dpmisim_type
  35. _dpmisim_type    db    0
  36.  
  37.     public    _dpmisim_vec
  38. _dpmisim_vec    db    0
  39.  
  40.     public    _dpmisim_regs
  41. _dpmisim_regs    label    dword
  42. ds_edi    dd    ?
  43. ds_esi    dd    ?
  44. ds_ebp    dd    ?
  45. ds_res    dd    ?
  46. ds_ebx    dd    ?
  47. ds_edx    dd    ?
  48. ds_ecx    dd    ?
  49. ds_eax    dd    ?
  50. ds_flg    dw    ?
  51. ds_es    dw    ?
  52. ds_ds    dw    ?
  53. ds_fs    dw    ?
  54. ds_gs    dw    ?
  55. ds_ip    dw    ?
  56. ds_cs    dw    ?
  57. ds_sp    dw    ?
  58. ds_ss    dw    ?
  59.  
  60.     public    _dpmisim_rmcb
  61. _dpmisim_rmcb    dd    32 dup(?)
  62.  
  63.     dd    128 dup (?)
  64. rmcb_temp_stack32    label    dword
  65.     dd    offset rmcb_task_switch
  66.     dw    g_rcode
  67.  
  68.     dw    128 dup (?)
  69. rmcb_temp_stack16    label    word
  70.  
  71.     end_data16
  72.  
  73. ;------------------------------------------------------------------------
  74.  
  75.     start_code16
  76.  
  77.     extrn    _memput:near
  78.     extrn    _memget:near
  79.     extrn    _go_til_stop:near
  80.  
  81. ds_savesp    dw    ?
  82. ds_savess    dw    ?
  83. ds_tmpds    dw    ?
  84.  
  85.     public    _dpmisim
  86. _dpmisim:
  87.  
  88.     pusha
  89.     push    es
  90.  
  91.     mov    cs:[ds_savesp], sp
  92.     mov    cs:[ds_savess], ss
  93.  
  94.     mov    ax,ds_flg
  95.     and    ax,0fcffh
  96.     push    ax
  97.     popf
  98.  
  99.     mov    edi, ds_edi
  100.     mov    esi, ds_esi
  101.     mov    ebp, ds_ebp
  102.     mov    ebx, ds_ebx
  103.     mov    edx, ds_edx
  104.     mov    ecx, ds_ecx
  105.     mov    eax, ds_eax
  106.     mov    es, ds_es
  107.     mov    fs, ds_fs
  108.     mov    gs, ds_gs
  109.     mov    ss, ds_ss
  110.     mov    sp, ds_sp
  111.  
  112.     push    cs
  113.     push    offset dpmisim_return
  114.     push    ds_cs
  115.     push    ds_ip
  116.     mov    ds, ds_ds
  117.     retf    ; actually a far call in disguise
  118. dpmisim_return:
  119.  
  120.     mov    cs:[ds_tmpds], ds
  121.     push    DGROUP
  122.     pop    ds
  123.     pushf
  124.     pop    ds_flg
  125.  
  126.     mov    ds_edi, edi
  127.     mov    ds_esi, esi
  128.     mov    ds_ebp, ebp
  129.     mov    ds_ebx, ebx
  130.     mov    ds_edx, edx
  131.     mov    ds_ecx, ecx
  132.     mov    ds_eax, eax
  133.     mov    ds_es, es
  134.     mov    ds_fs, fs
  135.     mov    ds_gs, gs
  136.     mov    ds_ss, ss
  137.     mov    ds_sp, sp
  138.     
  139.     mov    ax, cs:[ds_tmpds]
  140.     mov    ds_ds, ax
  141.  
  142.     mov    ss, cs:[ds_savess]
  143.     mov    sp, cs:[ds_savesp]
  144.  
  145.     pop    es
  146.     popa
  147.     ret
  148.  
  149. rmcb_number    db    ?
  150.  
  151. rmcb    macro    n
  152.     mov    cs:[rmcb_number],n
  153.     jmp    short rmcb_common
  154.     endm
  155.  
  156.     public    _dpmisim_rmcb0
  157. _dpmisim_rmcb0:
  158.     rmcb    0
  159.     public    _dpmisim_rmcb1
  160. _dpmisim_rmcb1:
  161.     x=1
  162.     rept 15
  163.      rmcb x
  164.      x=x+1
  165.     endm
  166.  
  167. rmcb_common:
  168.     mov    cs:[ds_tmpds], ds
  169.     push    DGROUP
  170.     pop    ds
  171.     pushf
  172.     pop    ds_flg
  173.  
  174.     mov    ds_edi, edi        ; save registers
  175.     mov    ds_esi, esi
  176.     mov    ds_ebp, ebp
  177.     mov    ds_ebx, ebx
  178.     mov    ds_edx, edx
  179.     mov    ds_ecx, ecx
  180.     mov    ds_eax, eax
  181.     mov    ds_es, es
  182.     mov    ds_fs, fs
  183.     mov    ds_gs, gs
  184.     mov    ds_ss, ss
  185.     mov    ds_sp, sp
  186.  
  187.     mov    ax,cs:[ds_tmpds]
  188.     mov    ds_ds, ax        ; move DS to proper location
  189.  
  190.     mov    ax,ds            ; set up our local stack
  191.     mov    ss,ax
  192.     mov    sp, offset rmcb_temp_stack16
  193.  
  194.     push    ds
  195.     pop    es
  196.     
  197.     mov    bl, cs:[rmcb_number]
  198.     mov    bh,0
  199.     shl    bx,3
  200.  
  201.     push    bx
  202.     push    50            ; copy the registers to protected memory
  203.     push    ds
  204.     push    offset _dpmisim_regs
  205.     mov    eax,_dpmisim_rmcb[bx+4]
  206.     add    eax,_ARENA
  207.     push    eax
  208.     call    _memput
  209.     add    sp,10
  210.     pop    bx
  211.  
  212.     mov    ax, _arena_cs        ; cs:eip for function to call
  213.     mov    _r_tss.tss_cs, ax
  214.     mov    eax, _dpmisim_rmcb[bx]
  215.     mov    _r_tss.tss_eip, eax
  216.  
  217.     mov    ax, _arena_ds        ; es:edi for pointer to registers
  218.     mov    _r_tss.tss_es, ax
  219.     mov    eax, _dpmisim_rmcb[bx+4]
  220.     mov    _r_tss.tss_edi, eax
  221.  
  222.     mov    ax, _core_selector    ; ds:esi for pointer to caller stack
  223.     mov    _r_tss.tss_ds, ax
  224.     mov    eax,0
  225.     mov    ax,ds_ss
  226.     shl    eax,4
  227.     mov    ebx,0
  228.     mov    bx,ds_sp
  229.     add    eax,ebx
  230.     mov    _r_tss.tss_esi, eax
  231.  
  232.     mov    ax, _core_selector    ; ss:esp for pointer to temp stack
  233.     mov    _r_tss.tss_ss, ax
  234.     mov    eax,0
  235.     mov    ax,ds
  236.     shl    eax,4
  237.     mov    ebx,0
  238.     mov    bx,offset rmcb_temp_stack32
  239.     add    eax,ebx
  240.     and    eax,0fffffffch
  241.     mov    _r_tss.tss_esp, eax
  242.  
  243.     push    _tss_ptr
  244.     mov    ax,offset _r_tss
  245.     mov    _tss_ptr,ax
  246.  
  247.     call    _go_til_stop
  248.     
  249.     pop    _tss_ptr
  250.  
  251.     mov    bl, cs:[rmcb_number]
  252.     mov    bh,0
  253.     shl    bx,3
  254.  
  255.     push    bx    
  256.     push    50            ; copy the registers from protected memory
  257.     push    ds
  258.     push    offset _dpmisim_regs
  259.     mov    eax,_dpmisim_rmcb[bx+4]
  260.     add    eax,_ARENA
  261.     push    eax
  262.     call    _memget
  263.     add    sp,10
  264.     pop    bx
  265.  
  266.     mov    ss,ds_ss
  267.     mov    sp,ds_sp
  268.  
  269.     mov    edi, ds_edi
  270.     mov    esi, ds_esi
  271.     mov    ebp, ds_ebp
  272.     mov    ebx, ds_ebx
  273.     mov    edx, ds_edx
  274.     mov    ecx, ds_ecx
  275.     mov    eax, ds_eax
  276.     mov    es, ds_es
  277.     mov    fs, ds_fs
  278.     mov    gs, ds_gs
  279.  
  280.     push    ds_flg
  281.     push    ds_cs
  282.     push    ds_ip
  283.     mov    ds, ds_ds
  284.     iret            ; jmp to wherever the regs said to
  285.  
  286. rmcb_task_switch:
  287.     jmpt    g_ctss
  288.  
  289.     end_code16
  290.  
  291. ;------------------------------------------------------------------------
  292.  
  293.     end
  294.